package model

import (
	"fmt"
	"ginblog/utils"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

var (
	db  *gorm.DB
	err error
)

// InitDb 初始化数据库
func InitDb() {
	dsn := fmt.Sprintf(
		"%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		utils.DbUser,
		utils.DbPassWord,
		utils.DbHost,
		utils.DbPort,
		utils.DbName,
	)
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		// Logger: logger.Default.LogMode(logger.Silent),
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 使用单数表名，启用该选项，此时，`User` 的表名应该是 `user`，默认是`users`
		},
	})
	if err != nil {
		fmt.Println("连接数据库失败，请检查参数配置：", err)
		panic(err)
	}

	// 迁移数据库
	db.AutoMigrate(&User{}, &Category{}, &Article{}, &Profile{})

	// GORM 使用 [database/sql](https://pkg.go.dev/database/sql) 来维护连接池
	sqlDB, _ := db.DB()

	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)

	// SetConnMaxLifetime 设置了连接可复用的最大时间。注意不能大于框架的time out时间
	sqlDB.SetConnMaxLifetime(10 * time.Second)

}
